package com.rockontrol.ele.service.model.dbtransaction.impl;

import java.math.BigDecimal;
import java.rmi.RemoteException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;

import rk.stub.oup.BaEmployeeSvc;
import rk.stub.oup.BaOrgSvc;

import com.rksp.svc.BaseSvc;
import com.rksp.util.DatabaseUtil;
import com.rksp.util.DateUtil;
import com.rksp.util.StringUtil;
import com.rockontrol.ele.pojo.Ma劳保台帐;
import com.rockontrol.ele.pojo.Ma劳保台帐明细;
import com.rockontrol.ele.pojo.Ma帐套;
import com.rockontrol.ele.pojo.Ma物资库存;
import com.rockontrol.ele.pojo.Ma物资计划;
import com.rockontrol.ele.pojo.Ma物资计划明细;
import com.rockontrol.ele.service.model.dbtransaction.MaPlanTrans;
import com.rockontrol.ele.vo.MaterialPlanSummarizingCdt;
import com.rockontrol.oup.vo.Employee;
import com.rockontrol.oup.vo.EmployeeCdt;
import com.rockontrol.oup.vo.Org;

public class MaPlanTransImpl extends BaseSvc implements MaPlanTrans {
    
    private Logger log = Logger.getLogger(MaPlanTransImpl.class);
    private BaEmployeeSvc baEmployeeSvcStub;
    private BaOrgSvc baOrgSvcStub;
	/**
     * 生成编号
     * @param type
     * @return
     */
    private synchronized static String getCode(String type){
//      Random random=new Random();
        StringBuffer code = new StringBuffer("WKMA");
        code.append(type);
        code.append(DateUtil.date2String(new Date(), "yyMMddHHmmssSSS"));
        return code.toString();
    }
    public String serviceCreateThePurchaseMaterialPlan(Ma物资计划 pmp){

        pmp.set录入时间(new Timestamp(new Date().getTime()));
        service.addObj(pmp);
        try{
            if(pmp.getPlanDetail()!=null){
                for(Ma物资计划明细 mx:pmp.getPlanDetail()){
                	mx.set采购计划id(pmp.getOid());
                	mx.set录入时间(new Timestamp(new Date().getTime()));
                	//查询所有未领完的明细
                	if("需求计划".equals(pmp.get分类())){
                    	mx.set领用状态("未领");
            			mx.set上月余量(new BigDecimal(0d));
                		List<Ma物资计划明细> list=service.findObjsHQL("from Ma物资计划明细 a where a.领用状态='未领' and a.购买状态 is null and a.物资分类id='"+mx.get物资分类id()+"' and a.规格型号id='"+mx.get规格型号id()+"' order by a.录入时间 desc");
                		Ma物资计划明细 old=list!=null&&!list.isEmpty()?list.get(0):null;
                		if(old!=null){
                			mx.set上月余量(old.get未领数量());
                			service.execHQL("update Ma物资计划明细 a set a.领用状态='已领' where a.领用状态='未领' and a.购买状态 is null and a.物资分类id='"+mx.get物资分类id()+"' and a.规格型号id='"+mx.get规格型号id()+"'");
                		}
            			if(mx.get申请数量().doubleValue()>mx.get上月余量().doubleValue())
            				mx.set批准数量(new BigDecimal(mx.get申请数量().doubleValue()-mx.get上月余量().doubleValue()));
            			else
            				mx.set批准数量(new BigDecimal(0d));
            			mx.set未领数量(new BigDecimal(mx.get批准数量().doubleValue()+mx.get上月余量().doubleValue()));
                	}
                    service.addObj(mx);
                }
            }
        }catch(Exception e){
            log.error(e.getMessage());
            e.printStackTrace();
            throw new RuntimeException();
            
        }
        return pmp.getOid();
    }
    public Boolean serviceDeldeteThePurchaseMaterialPlan(String oid){
        Boolean flag=false;
        try{
            service.execHQL("delete from Ma物资计划明细 where 采购计划id='"+oid+"'");
            service.execHQL("delete from Ma物资计划 where oid='"+oid+"'");
            flag=true;
        }catch(Exception e){
            log.error(e.getMessage());
            e.printStackTrace();
            throw new RuntimeException();
        }
        return flag;
    }
    public Boolean serviceUpdateThePurchaseMaterialPlan(Ma物资计划 pmp, String employeeid){
        try{
            if(pmp!=null){
                service.modifyObj(pmp);
                service.execHQL("delete from Ma物资计划明细 where 采购计划id='"+pmp.getOid()+"'");
                if(pmp.getPlanDetail()!=null){
                    for(Ma物资计划明细 mx:pmp.getPlanDetail()){
                    	mx.set采购计划id(pmp.getOid());
                    	//修改申请计划数量关系
                    	if("需求分类".equals(pmp.get分类())){
                        	mx.set领用状态("未领");
	                    	if(pmp.isUpdateCount()){
	                    	    if( null != mx.get上月余量()){
	                        	    mx.set上月余量(new BigDecimal(0d));
	                        	    List<Ma物资计划明细> list=service.findObjsHQL("from Ma物资计划明细 a where a.领用状态='未领' and a.购买状态 is null and a.物资分类id='"+mx.get物资分类id()+"' and a.规格型号id='"+mx.get规格型号id()+"' order by a.录入时间 desc");
	                        		Ma物资计划明细 old=list!=null&&!list.isEmpty()?list.get(0):null;
	                        		if(old!=null){
	                        			mx.set上月余量(old.get未领数量());
	                        			service.execHQL("update Ma物资计划明细 a set a.领用状态='已领' where a.领用状态='未领' and a.购买状态 is null and a.物资分类id='"+mx.get物资分类id()+"' and a.规格型号id='"+mx.get规格型号id()+"'");
	                        		}
	                    	    }
	                			if(mx.get申请数量().doubleValue()>mx.get上月余量().doubleValue())
	                				mx.set批准数量(new BigDecimal(mx.get申请数量().doubleValue()-mx.get上月余量().doubleValue()));
	                			else
	                				mx.set批准数量(new BigDecimal(0d));
	                    	}
	                    	mx.set未领数量(new BigDecimal(mx.get批准数量().doubleValue()+mx.get上月余量().doubleValue()));
	                    }
                    	//TODO修改采购计划数量
                    	if("采购计划".equals(pmp.get分类())){
                        	mx.set购买状态("未购");
                    		List<Ma帐套> list1= service.findObjsHQL("from Ma帐套 a where a.单位id='"+pmp.get申请单位id()+"' and a.类型分类名='"+pmp.get类型分类名()+"'");
            			    if(list1==null||list1.size()==0){
            			    	mx.set库存量(BigDecimal.valueOf(0d));
            			    }else{
                				List<Ma物资库存> list物资库存 =service.findObjsHQL("from Ma物资库存  a where a.帐套id='"+list1.get(0).getOid()+"' and a.规格型号id='"+mx.get规格型号id()+"' and a.物资分类id= '"+mx.get物资分类id()+"'");
                				if(list物资库存!=null&&!list物资库存.isEmpty()){
                					mx.set库存量(list物资库存.get(0).get库存量());
                				}else{
                					mx.set库存量(BigDecimal.valueOf(0d));
                				}
            			    }
            			    if(mx.get申请数量().doubleValue()>mx.get库存量().doubleValue())
            			    	mx.set批准数量(new BigDecimal(mx.get申请数量().doubleValue()-mx.get库存量().doubleValue()));
            			    else 
            			    	mx.set批准数量(new BigDecimal(0d));
	                    	if(pmp.isUpdateBuy()){
	                    		mx.set上月未购(new BigDecimal(0d));
	                    		List<Ma物资计划明细> list=service.findObjsHQL("from Ma物资计划明细 a where a.购买状态='未购' and a.购买状态 is null and a.物资分类id='"+mx.get物资分类id()+"' and a.规格型号id='"+mx.get规格型号id()+"' order by a.录入时间 desc");
	                    		Ma物资计划明细 old=list!=null&&!list.isEmpty()?list.get(0):null;
	                    		if(old!=null){
	                    			mx.set上月未购(old.get未购数量());
	                    			service.execHQL("update Ma物资计划明细 a set a.购买状态='已购' where a.购买状态='未购' and a.购买状态 is null and a.物资分类id='"+mx.get物资分类id()+"' and a.规格型号id='"+mx.get规格型号id()+"'");
	                    		}
	                    		mx.set批准数量(new BigDecimal(mx.get批准数量().doubleValue()+mx.get上月未购().doubleValue()));
	                    	}
	        				mx.set录入人(pmp.get录入人姓名());
	        				mx.set录入人id(pmp.get录入人id());
	        				mx.set录入时间(new Timestamp(new Date().getTime()));
                    	}
            			service.addObj(mx);
                    }
                }
            }
        }catch(Exception e){
            log.error(e.getMessage());
            e.printStackTrace();
            throw new RuntimeException();
            
        }
        
        return true;
    }
	public String serviceSummaryPlan(MaterialPlanSummarizingCdt cdt_) throws RemoteException {
		//创建采购计划对象
		Ma物资计划 ma物资计划=createPlan(cdt_, cdt_.getPurchaseType());
		service.addObj(ma物资计划);
		String dataBaseType = DatabaseUtil.getDataBaseType(dataSource);
		//汇总明细 根据条件取得需求计划
		StringBuffer hql=new StringBuffer("from Ma物资计划  p where p.生成汇总 = '未汇总' and p.分类 = '需求计划' and p.审批状态='已审批' ");

        if(cdt_!=null){
            if(!StringUtil.isEmpty(cdt_.getMaterialType())){
                hql.append(" and p.类型分类名 = '"+cdt_.getMaterialType()+"' ");
            }
//            if(!StringUtil.isEmpty(cdt_.getSummarizingDepartmentID())){
//                hql.append(" and p.申请单位id = '"+cdt_.getSummarizingDepartmentID()+"' ");
//            }
            if(!StringUtil.isEmpty(cdt_.getStartDate())){
                if("SQLSERVER".equals(dataBaseType)){
                    //数据库为sqlserver时执行的操作
                    hql.append(" and p.申请时间 >= '"+cdt_.getStartDate()+"' ");
                }else if("ORACLE".equals(dataBaseType)){
                        //数据库为oracle时执行的操作
                    hql.append(" and to_char(p.申请时间,'yyyy-mm-dd') >= '"+cdt_.getStartDate()+"' ");
                }
            }
            if(!StringUtil.isEmpty(cdt_.getEndDate())){
                if("SQLSERVER".equals(dataBaseType)){
                    //数据库为sqlserver时执行的操作
                    hql.append(" and p.申请时间 <= '"+cdt_.getEndDate()+"' ");
                }else if("ORACLE".equals(dataBaseType)){
                        //数据库为oracle时执行的操作
                    hql.append(" and to_char(p.申请时间,'yyyy-mm-dd') <= '"+cdt_.getEndDate()+"' ");
                }
            }
            if(!StringUtil.isEmpty(cdt_.getPlanType())){
                hql.append(" and p.采购分类 = '"+cdt_.getPlanType()+"' ");
            }
        }
        List<Ma物资计划> planList=service.findObjsHQL(hql.toString());
        
        StringBuffer ids=new StringBuffer();
        //获取申请计划id，修改该计划的汇总状态
       BigDecimal sum=new BigDecimal(0);
        for(Ma物资计划 plan:planList){
        	ids.append("'").append(plan.getOid()).append("',");
        	plan.set关联计划id(ma物资计划.getOid());
        	plan.set生成汇总("已汇总");
        	sum=sum.add(plan.get金额总计());
        	service.modifyObj(plan);
        }
        //将物资计划的金额设置一下
        ma物资计划.set金额总计(sum);
        service.modifyObj(ma物资计划);
        
        if (ids.length()>0) {
			ids.deleteCharAt(ids.length()-1);
		}else{
		    ids.append("''");
		}
        
		//将所有的明细按照分类、型号和采购类型进行汇总统计。
		StringBuffer sql=new StringBuffer();
		if("SQLSERVER".equals(dataBaseType)){
		        //数据库为sqlserver时执行的操作
		    sql.append("select convert(varchar(32), a.规格型号ID) 规格型号id,a.规格流水号,a.规格型号,a.物资分类," +
	                "convert(varchar(32)," +
	                " a.物资分类ID) 物资分类id,a.分类编码,b.采购权限,max(c.单价) 采购单价,sum(a.批准数量) 申请数量," +
	                "max(c.单价)*sum(a.申请数量) 金额,'基层汇总' 明细类型,GETDATE() 录入时间," +
	                "max(b.单位) 单位,max(c.单价) 计划单价,sum(a.申请数量) 批准数量,a.规格型号,max(convert(varchar(32), c.生产厂商ID)) 厂商id," +
	                "max(c.厂商名称) 厂商名称,max(a.用途) 用途,max(技术参数) 技术参数,max(a.备注) 备注");
		}else if("ORACLE".equals(dataBaseType)){
		        //数据库为oracle时执行的操作
		    sql.append("select to_char(a.规格型号ID) \"规格型号id\",a.规格流水号,a.规格型号,a.物资分类," +
	                "to_char(" +
	                " a.物资分类ID) \"物资分类id\",a.分类编码,b.采购权限,max(c.单价) 采购单价,sum(a.批准数量) 申请数量," +
	                "max(c.单价)*sum(a.申请数量) 金额, cast('基层汇总' as nvarchar2(8)) 明细类型,to_timestamp(sysdate) 录入时间," +
	                "max(b.单位) 单位,max(c.单价) 计划单价,sum(a.申请数量) 批准数量,a.规格型号,max(to_char(c.生产厂商ID)) \"厂商id\"," +
	                "max(c.厂商名称) 厂商名称,max(a.用途) 用途,max(技术参数) 技术参数,max(a.备注) 备注");
		}

		sql.append(" from MA_物资计划明细 a left join BA_物资分类 b on b.OID=a.物资分类ID " +
				"left join BA_规格型号 c on a.规格型号ID=c.OID");
		sql.append(" where a.采购计划ID in ("+ids.toString()+") group by a.规格型号ID,a.规格流水号,a.规格型号,a.物资分类,a.物资分类ID,b.采购权限,a.分类编码,a.明细类型");
		List<Ma物资计划明细> list=service.findSQLAlias(sql.toString(), Ma物资计划明细.class);
		EmployeeCdt cdt=new EmployeeCdt();
		Employee employee=baEmployeeSvcStub.getTheEmployee(cdt_.getSummarizingPersonID());
		if(list!=null)
			for(int i=0;i<list.size();i++){
			    List<Ma帐套> list1= service.findObjsHQL("from Ma帐套 a where a.单位id='"+cdt_.getSummarizingDepartmentID()+"' and a.类型分类名='"+cdt_.getMaterialType()+"'");
			    if(list1==null||list1.size()==0){
			        list.get(i).set库存量(BigDecimal.valueOf(0d));
			    }else{
    				List<Ma物资库存> list物资库存 =service.findObjsHQL("from Ma物资库存  a where a.帐套id='"+list1.get(0).getOid()+"' and a.规格型号id='"+list.get(i).get规格型号id()+"' and a.物资分类id= '"+list.get(i).get物资分类id()+"'");
    				if(list物资库存!=null&&!list物资库存.isEmpty()){
    					list.get(i).set库存量(list物资库存.get(0).get库存量());
    				}else{
    					list.get(i).set库存量(BigDecimal.valueOf(0d));
    				}
			    }
			    if(list.get(i).get申请数量().doubleValue()>list.get(i).get库存量().doubleValue())
			    	list.get(i).set批准数量(new BigDecimal(list.get(i).get申请数量().doubleValue()-list.get(i).get库存量().doubleValue()));
			    else 
			    	list.get(i).set批准数量(new BigDecimal(0d));
			    list.get(i).set上月未购(new BigDecimal(0d));
        		List<Ma物资计划明细> list2=service.findObjsHQL("from Ma物资计划明细 a where a.购买状态='未购' and a.购买状态 is null and a.物资分类id='"+list.get(i).get物资分类id()+"' and a.规格型号id='"+list.get(i).get规格型号id()+"' order by a.录入时间 desc");
        		Ma物资计划明细 old=list2!=null&&!list2.isEmpty()?list2.get(0):null;
        		if(old!=null){
        			list.get(i).set上月未购(old.get未购数量());
        			service.execHQL("update Ma物资计划明细 a set a.购买状态='已购' where a.购买状态='未购' and a.购买状态 is null and a.物资分类id='"+list.get(i).get物资分类id()+"' and a.规格型号id='"+list.get(i).get规格型号id()+"'");
        		}
        		list.get(i).set批准数量(new BigDecimal(list.get(i).get批准数量().doubleValue()+list.get(i).get上月未购().doubleValue()));
				list.get(i).set购买状态("未购");
				list.get(i).set采购计划id(ma物资计划.getOid());
				list.get(i).set录入人(employee.getName());
				list.get(i).set录入人id(cdt_.getSummarizingPersonID());
				list.get(i).set录入时间(new Timestamp(new Date().getTime()));
				service.addObj(list.get(i));
			}
		
		return ma物资计划.getOid();
	}
	/**
	 * 创建分类为采购计划 的 物资计划 实例
	 * @param cdt_
	 * @param t1
	 * @return
	 * @throws RemoteException
	 */
	private Ma物资计划 createPlan(MaterialPlanSummarizingCdt cdt_,String t1) throws RemoteException {
		Ma物资计划 ma物资计划=new Ma物资计划();
		ma物资计划.set生成汇总("已汇总");
		ma物资计划.set分类("采购计划");
		ma物资计划.set单据编号(getCode("CG"));
		ma物资计划.set审批状态("未审批");
		Employee employee = new Employee();
        try{
            employee = baEmployeeSvcStub.getTheEmployee(cdt_.getSummarizingPersonID());
        }catch(Exception e){
            e.printStackTrace();
        }
		Org baOrg=baOrgSvcStub.getTheOrg(cdt_.getSummarizingDepartmentID());
		ma物资计划.set录入人姓名(employee.getName());
		ma物资计划.set录入人id(cdt_.getSummarizingPersonID());
		ma物资计划.set录入单位id(baOrg.getId());//cdt_.getSummarizingDepartmentID()
		ma物资计划.set录入单位(baOrg.getName());
		ma物资计划.set录入单位编码(baOrg.getCode());
		ma物资计划.set申请人id(cdt_.getSummarizingPersonID());
		
		ma物资计划.set申请人姓名(employee.getName());
		ma物资计划.set申请单位id(baOrg.getId());
		ma物资计划.set申请单位(baOrg.getName());
		ma物资计划.set申请单位编码(baOrg.getCode());
		ma物资计划.set录入时间(new Timestamp(new Date().getTime()));
		ma物资计划.set申请单位id(cdt_.getSummarizingDepartmentID());
		ma物资计划.set申请时间(new Timestamp(DateUtil.string2Date(cdt_.getSummarizingDate(),"yyyy-MM-dd").getTime()));
		ma物资计划.set类型分类名(cdt_.getMaterialType());
		ma物资计划.set采购方式(t1);
		return ma物资计划;
	}
    public Boolean serviceCreateTheLabourProtection(Ma劳保台帐 pmp){
        List<Ma劳保台帐明细> mxList=new ArrayList<Ma劳保台帐明细>();
        if(pmp!=null)
        mxList=pmp.getMxList();
        for(Ma劳保台帐明细 mx:mxList){
            service.addObj(mx);
        }
        service.addObj(pmp);
        return true;
    }
    
    private Ma帐套 getTheMaterialAccount (String id_,String type){
        if(StringUtil.isEmpty(id_)||StringUtil.isEmpty(type))
            return null;
        List<Ma帐套> list= service.findObjsHQL("from Ma帐套 a where a.单位id='"+id_+"' and a.类型分类名='"+type+"' and a.类型='实体库'");
        return list.isEmpty()?null:list.get(0);
    }
    public Boolean serviceUpdateTheLabourProtection(Ma劳保台帐 pmp){
        List<Ma劳保台帐明细> mxList=new ArrayList<Ma劳保台帐明细>();
        if(pmp!=null){
            if("否".equals(pmp.get是否批准())){
                mxList=pmp.getMxList();
                for(Ma劳保台帐明细 mx:mxList){
                    service.modifyObj(mx);
                }
                service.modifyObj(pmp);
            }else{
                Ma帐套 out=null;
                mxList=pmp.getMxList();
                for(Ma劳保台帐明细 mx:mxList){
                    service.modifyObj(mx);
                    if(!StringUtil.isEmpty(pmp.get发放单位id())){
                        out=getTheMaterialAccount(pmp.get发放单位id(), mx.get物资分类());
                        }
                    
                        if(out!=null)
                            service.execHQL("update Ma物资库存 a set a.库存量=a.库存量-"+mx.get数量()+" where a.帐套id='"+out.getOid()+"' and a.物资分类id='"+mx.get物资分类id()+"' and a.规格型号id='"+mx.get规格型号id()+"'");
                       
                    
                }
                service.modifyObj(pmp);
            }
        }
        return null;
    }
    public Boolean serviceDeleteTheLabourProtection(String id_){
        service.execHQL("delete from Ma劳保台帐 a where a.oid='"+id_+"'");
        service.execHQL("delete from Ma劳保台帐明细 a where a.劳保台帐id='"+id_+"'");
        return true;
    }
	public void setBaEmployeeSvcStub(BaEmployeeSvc baEmployeeSvcStub) {
		this.baEmployeeSvcStub = baEmployeeSvcStub;
	}
	public void setBaOrgSvcStub(BaOrgSvc baOrgSvcStub) {
		this.baOrgSvcStub = baOrgSvcStub;
	}
}
